package cn.tedu.v4;

/**
 * Version 4 消息转发
 * 功能：一个客户端发送给服务器文本，转发至其他客户端
 * 客户端   多线程  ×
 * 服务器   多线程  √   只加一个多线程，替换 消息已转发  方案
 * ------------------------------------------------------
 * 多线程并发安全问题：
 * 1.当多个线程并发操作同一个资源时，由于线程切换时间不确定【CPU时间片
 * 获取线程时机不确定】，可能导致代码执行混乱或者进入正确状态，程序
 * 出现错误，更严重情况软件瘫痪
 *
 * synchronized 多线程关键字
 *
 * 语法情景1：同步块方式
 * 语法：synchronized(同步监视对象){
 *
 * }
 * 语法情景2：同步方法方式
 * 语法：public synchronized void method(){
 *
 * }
 * 同步机制：可以控制线程的执行顺序，避免线程间切换冲突  √
 * 异步机制：不控制线程执行顺序，执行两套功能顺序   ×
 * 案例：上WC
 */
public class Thread_syn {
    public static void main(String[] args) {
        //创建WC对象
        WC wc=new WC();
        //创建两个线程对象
        Thread p1=new Thread(()->{
            wc.go();
        });
        Thread p2=new Thread(()->{
          wc.go();
        });
        //统一启动
        p1.start();
        p2.start();
    }
}
//创建WC
class  WC{
public void go(){
    Thread t=Thread.currentThread();
    //获取线程实例：Thread[main,5,main]
    System.out.println(t.getName()+"去厕所...");
    try {//this  指代当前线程---哪条线程先被CPU时间片适中，先被执行
        synchronized (this) {//监视同步对象：先来线程，立即确定加锁！
            Thread.sleep(5000);
            System.out.println(t.getName()+"找门进去...");
        }
        Thread.sleep(5000);
        System.out.println(t.getName()+"穿裤子走人...");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    }
    }
